package db

import (
	"context"
	"fmt"
	"log"
	"sync"
	"time"

	"gitee.com/li-zhenyi/yi-nian-zhi-jian/backend/internal/config"
	"github.com/go-redis/redis/v8"
)

var (
	redisClient *redis.Client
	redisOnce   sync.Once
)

// InitRedis 初始化Redis连接
// 这个函数使用单例模式确保全局只有一个Redis连接实例
func InitRedis(cfg *config.Config) (*redis.Client, error) {
	var err error
	redisOnce.Do(func() {
		// 创建Redis客户端
		redisClient = redis.NewClient(&redis.Options{
			Addr:     fmt.Sprintf("%s:%d", cfg.Redis.Host, cfg.Redis.Port),
			Password: cfg.Redis.Password, // 无密码时为空
			DB:       cfg.Redis.DB,
			PoolSize: 100, // 连接池大小
		})

		// 测试连接
		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
		defer cancel()

		_, err = redisClient.Ping(ctx).Result()
		if err != nil {
			log.Printf("Redis连接失败: %v", err)
			return
		}

		log.Println("Redis连接成功")
	})

	return redisClient, err
}

// GetRedisClient 获取Redis客户端实例
// 这个函数返回已初始化的Redis客户端实例
func GetRedisClient() *redis.Client {
	return redisClient
}

// CloseRedis 关闭Redis连接
// 在应用程序退出时调用这个函数来释放资源
func CloseRedis() error {
	if redisClient != nil {
		return redisClient.Close()
	}
	return nil
}